//构造函数方式创建的一个类似于对象的键值对数据结构
//new Map([[key,val],[key,val],..])  参数是数组集合，每一个数组是两个值(键值对)
console.log(new Map([[1,2],[3,4]]));  //Map { 1 => 2, 3 => 4 }

//与对象的区别
//1.一个对象，键名必须为字符串，如果不是字符串也会默认转换为字符串
//Map对象，键名可以是任何数据类型
let a = true , b = [1,2] , o = {}
let obj = {
	name:'张三',
	[a]:true,
	[b]:'数组',
	[o]:{},
}
console.log(obj)
//{ name: '张三', true: true, '1,2': '数组', '[object Object]': {} }
//如上：各种类型的数据都被转化为了字符串
let map = new Map([['name','张三'],[a,true],[b,'数组'],[o,{}]])
console.log(map)
//Map { 'name' => '张三', true => true, [ 1, 2 ] => '数组', {} => {} }
//如上：Map对象，键名可以是任何数据类型

//方法：与Set不同的是，没有add()方法，而多了get()和set()方法

//size属性  键值对个数
console.log(map.size)  //4

//get set has delete clear 方法

//get(key) 获取值 
console.log(map.get(a))  //true

//set(key,value) 新增键值对，返回值为新增后的实例（key与原先一致为修改，没有为新增）
//由于返回的是新实例，所以可以链式写法
console.log(map.set(1,'数字1'));  //新增
console.log(map.set(1,'数字2'));  //修改

//has(key) 判断key有无对应的value值 返回布尔值
console.log(map.has(1));  //true

//delete 删除键值对  返回值为布尔值
console.log(map.delete(1));  //true
console.log(map);  //删除后的实例
console.log(map.delete(1)); //false

//clear() 清空map  无参数 无返回值
console.log(map.clear());  //undefined
console.log(map);  //Map {}

//forEach keys values entries  遍历
let map2 = new Map([[1,'one'],[2,'two'],[3,'three']]);

//forEach
//forEach((val,key,this)=>{})其中的val和key代表map对象的值和键，this代表当前实例
map2.forEach((...arg)=>{
	console.log(arg)
})
//[ 'one', 1, Map { 1 => 'one', 2 => 'two', 3 => 'three' } ]
//[ 'two', 2, Map { 1 => 'one', 2 => 'two', 3 => 'three' } ]
//[ 'three', 3, Map { 1 => 'one', 2 => 'two', 3 => 'three' } ]

//keys
for(item of map2.keys()){
	console.log(item)
}
//1
//2
//3

//values
for(item of map2.values()){
	console.log(item)
}
//one
//two
//three

//entries
for(item of map2.entries()){
	console.log(item)
}
//[ 1, 'one' ]
//[ 2, 'two' ]
//[ 3, 'three' ]
for(let [key,val] of map2.entries()){
	console.log(key,val)
}
//1 'one'
//2 'two'
//3 'three'

//将数组变为Map
let arr = ['one','two','three']
let map3 = new Map()
for(let i=0;i<arr.length;i++){
	map3.set(i,arr[i])
}
console.log(map3); //Map { 0 => 'one', 1 => 'two', 2 => 'three' }
//上述的循环语句可以写为
let map4 = new Map()
for(let [i,v] of arr.entries()){
	map4.set(i,v)
} //数组同样有entries()方法
console.log(map4); //Map { 0 => 'one', 1 => 'two', 2 => 'three' }